import { defineStore } from 'pinia'
import { sysLoginPost, sysProfile } from '@/api/login'
import { loginData } from '@/api/apiType'
import { getUser } from '@/api/employees'
// 在ts文件中,直接调用router文件夹下的router实例实现跳转即可(初始化的跳转不了)
import router, { roleRouterData } from '@/router'
import { useRoutesStore } from './routes'
import { routerData } from '@/router/index'

export const useUserStore = defineStore('user', {
  state: () => {
    return {
      token: '' as string,
      userInfo: {} as any
    }
  },
  actions: {
    async changeToken(form: loginData) {
      const res = await sysLoginPost(form)
      this.token = res.data
    },
    loginOut() {
      const { addRouterData } = useRoutesStore()
      this.token = ''
      this.userInfo = {}
      addRouterData([])
      router.replace('/login')
      // 登出要重置router的路由配置, 不然没刷新页面再登录就会有之前的添加的路由权限
      location.reload()
    },
    // 获取用户基本信息
    async getUserInfo() {
      // 获取用户权限
      const res = await sysProfile()
      // 获取用户信息
      const res2 = await getUser(res.data.userId)
      this.userInfo = Object.assign({}, res.data, res2.data)
      // 用户权限数组
      const roleRouter = res.data.roles.menus
      // 把动态路由中用户拥有的权限过滤出来
      const addRouter = roleRouterData.filter((item): any =>
        roleRouter.includes(item.name)
      )
      // 添加不存在地址重定向404
      // 为什么不写在静态路由? 因为在静态路由的话, addroute重走导航前置守卫会直接到404
      addRouter.push({
        path: '/:pathMatch(.*)*',
        redirect: '/404',
        meta: { hidden: true }
      } as any)

      // 获取修改导航列表数组方法
      const { addRouterData } = useRoutesStore()
      // 把静态路由和动态路由添加进入
      const newArr = [...routerData]
      newArr[2].children?.push(...(addRouter as any))
      addRouterData(newArr)
      // addRouterData([...routerData, ...addRouter])
      // router.addRoute添加路由配置, vue-router4只接受单个配置,所以需要循环添加
      // 并且需要重走导航前置守卫才会生效
      addRouter.forEach((item) => {
        // router.addRoute('添加为哪个路由的子组件', 单个路由配置对象)
        router.addRoute('layout', item)
      })
    }
  },
  getters: {},
  persist: {
    // enabled: true , // 这个配置为true代表这个文件存储生效
    enabled: true,
    strategies: [
      // { storage: sessionStorage, paths: ['firstName', 'lastName'] }, // firstName 和 lastName字段用sessionStorage存储
      { storage: localStorage, paths: ['token'] } // accessToken字段用 localstorage存储
    ]
  }
})

// export default useUserStore
